package com.atguigu.controller;


import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.config.AlipayConfig;
import com.atguigu.entity.PaymentInfo;
import com.atguigu.enums.PaymentStatus;
import com.atguigu.result.RetVal;
import com.atguigu.service.PaymentInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * <p>
 * 支付信息表 前端控制器
 * </p>
 *
 * @author GuoJH
 * @since 2021-09-10
 */
@RestController
@RequestMapping("/payment")
public class PaymentInfoController {
    @Autowired
    private PaymentInfoService paymentInfoService;
    //生成支付宝付款的二维码
    @RequestMapping("/createQrCode/{orderId}")
    public String createQrCode(@PathVariable Long orderId) throws Exception {
        return paymentInfoService.createQrCode(orderId);
    }
    //支付宝的异步通知回调
    @PostMapping("/async/notify")
    public String asyncNotify(@RequestParam Map<String,String> paramMap) throws Exception {//将异步通知中收到的所有参数都存放到map中
        //调用SDK验证签名 支付宝的异步通知返回的数据 要给支付宝返回success 如果商户反馈给支付宝的字符不是 success 这7个字符，支付宝服务器会不断重发通知，直到超过 24 小时 22 分钟。一般情况下，25 小时以内完成 8 次通知（通知的间隔频率一般是：4m,10m,10m,1h,2h,6h,15h）。
        boolean signVerified = AlipaySignature.rsaCheckV1(paramMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
        if(signVerified){
            //从paramMap中获取返回的交易状态
            String tradeStatus = paramMap.get("trade_status");
            //交易成功或者交易结束(说明交易已经成功) 则返回给支付宝success
            if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)){
                //修改支付订单的信息
                //从paramMap中获取订单的交易编号(商户订单号) 通过编号获取订单的信息
                String outTradeNo = paramMap.get("out_trade_no");
                PaymentInfo paymentInfo = paymentInfoService.getPaymentInfoByOutTradeNo(outTradeNo);
                //如果已经支付 或者 交易的订单已经关闭 则不再进行修改操作 防止支付宝异步的重复调用
                if (paymentInfo.getPaymentStatus().equals(PaymentStatus.PAID) ||
                paymentInfo.getPaymentStatus().equals(PaymentStatus.ClOSED)){
                    return "failure";
                }
                //更新支付的状态
                paymentInfoService.updatePaymentInfo(paymentInfo,paramMap);
                //更新订单的状态 通过rabbitmq发送消息实现
                return "success";
            }
        }else{
            return "failure";
        }
        return "failure";
    }
    //支付宝的退款接口  http://127.0.0.1:8006/payment/refund/28
    @RequestMapping("/refund/{orderId}")
    public RetVal refund(@PathVariable Long orderId) throws Exception {
        boolean flag = paymentInfoService.refund(orderId);
        return RetVal.ok(flag);
    }
    //关闭支付宝的交易接口
    @GetMapping("/closeAlipayTrade/{orderId}")
    public boolean closeAlipayTrade(@PathVariable Long orderId) throws Exception {
        return paymentInfoService.closeAlipayTrade(orderId);
    }
    //查询支付宝的内部订单信息
    @RequestMapping("/queryAlipayTrade/{orderId}")
    public boolean queryAlipayTrade(@PathVariable Long orderId) throws Exception {
        return paymentInfoService.queryAlipayTrade(orderId);
    }
    //通过商户订单号 out_trade_no  获取支付订单的信息
    @GetMapping("/getPaymentInfo/{outTradeNo}")
    public PaymentInfo getPaymentInfo(@PathVariable String outTradeNo){
        return paymentInfoService.getPaymentInfoByOutTradeNo(outTradeNo);
    }
}

